package com.imddy.gkrpc.common.utils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;

public class ReflectionUtils {

	/**
	 * 根据class创建对象
	 * 
	 * @param clazz 待创建对象
	 * @param       <T> 对象类型
	 * @return 创建好的对象
	 */
	public static <T> T newInstance(Class<T> clazz) {
		try {
			return clazz.newInstance();
		} catch (Exception e) {
			throw new IllegalStateException(e);
		}
	}

	/**
	 * 获取某个class的共有方法
	 * 
	 * @param clazz
	 * @return 指定类声明的共有方法数组
	 */
	public static Method[] getPublicMethods(Class clazz) {
		Method[] methods = clazz.getDeclaredMethods();
		List<Method> pMethods = new ArrayList<Method>();
		for (Method m : methods) {
			if (Modifier.isPublic(m.getModifiers())) {
				pMethods.add(m);
			}
		}
		return pMethods.toArray(new Method[0]);
	}

	/**
	 * 根据反射，传入参数，调用某个方法
	 * @param object
	 * @param method
	 * @param args
	 * @return
	 */
	public static Object invoke(Object object, Method method, Object... args) {
		try {
			return method.invoke(object, args);
		} catch (Exception e) {
			throw new IllegalStateException(e);
		}
	}

}
